﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace EnumConsoleApplication1
{
    //定义一个枚举
    public enum RootVegetables
    {
        山药 = 0,
        萝卜 = 1,
        青菜 = 2,
        西红柿 = 3
    }
    //定义一个位域
    //[Flags]
    [Flags]
    public enum Seasons
    {
        夏天 = 1,
        秋天 = 2,
        冬天 = 3,
        春天 = 8,
        //位域:将枚举作为位域（即一组标志）来处理
        所有季节 = 夏天 | 秋天 | 冬天 | 春天,
    }
    class Program
    {
        static void Main(string[] args)
        {
            //实例化一个哈希表
            Hashtable myHashtable = new Hashtable();
            //为哈希表中的元素赋值
            myHashtable[RootVegetables.山药] = Seasons.所有季节;
            myHashtable[RootVegetables.萝卜] = Seasons.春天;
            myHashtable[RootVegetables.青菜] = Seasons.夏天 | Seasons.秋天;
            myHashtable[RootVegetables.西红柿] = Seasons.秋天;
            //声明一个Seasons类型的数组，使用枚举值
            Seasons[] seasons = { Seasons.春天, Seasons.夏天, Seasons.秋天, Seasons.冬天 };
            for (int i = 0; i < seasons.Length; i++)
            {
                Console.WriteLine("\r\n 下面的蔬菜被收获在" + seasons[i].ToString("G") + ":");
                //循环访问哈希表中的元素
                foreach (DictionaryEntry e in myHashtable)
                {
                    //判断哈希表中的值是否与数组中的值有交集
                    //按位“与”运算符&用于比较两个整数的相应位，如果两个数的对应位都是1，返回相应的结果为1，有一个是0，返回就是0
                    /*转换成二进制数然后每位取相应的与或操作。然后将得到的二进制数转化成10进制。
                      例如：1|85就是0000001|1010101，1|1=1，1|0=1，0|0=0，得出结果1010101，转化成10进制为85.
                      ^为异或，具体的：1^0=1,0^0=1^1=0。
                    */
                    if (((Seasons)e.Value & seasons[i]) > 0)
                    {
                        Console.WriteLine("\t" + ((RootVegetables)e.Key).ToString("G"));
                    }
                }
            }
            Console.ReadLine();
        }
    }
}
